// Copyright Epic Games, Inc. All Rights Reserved.

#pragma once

// 预编译指令，确保头文件只被编译一次

#include "Engine/DataAsset.h"
// 包含UE引擎的数据资产基类

#include "LyraPawnData.generated.h"
// 包含由UE头文件工具生成的文件，用于支持UCLASS、UPROPERTY等宏

class APawn;
class ULyraAbilitySet;
class ULyraAbilityTagRelationshipMapping;
class ULyraCameraMode;
class ULyraInputConfig;
class UObject;
// 前向声明相关类，减少头文件依赖

/**
 * ULyraPawnData
 *
 *	非可变数据资产，包含用于定义Pawn的属性。
 */
UCLASS(BlueprintType, Const, Meta = (DisplayName = "Lyra Pawn Data", ShortTooltip = "Data asset used to define a Pawn."))
// UCLASS宏：定义UE类，BlueprintType表示可在蓝图中使用，Const表示内容不可变
class LYRAGAME_API ULyraPawnData : public UPrimaryDataAsset
// 类声明，继承自UPrimaryDataAsset（主数据资产）
{
	GENERATED_BODY()
	// UE宏：生成必要的C++代码

public:
	// 构造函数声明
	ULyraPawnData(const FObjectInitializer& ObjectInitializer);

public:
	// 为此Pawn实例化的类（通常应派生自ALyraPawn或ALyraCharacter）
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Lyra|Pawn")
	// UPROPERTY宏：EditDefaultsOnly表示可在编辑器默认值中编辑，BlueprintReadOnly表示在蓝图中只读
	TSubclassOf<APawn> PawnClass;
	// 模板类，限制为APawn或其派生类

	// 要授予此Pawn能力系统的能力集
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Lyra|Abilities")
	TArray<TObjectPtr<ULyraAbilitySet>> AbilitySets;
	// TObjectPtr数组，指向ULyraAbilitySet对象

	// 此Pawn采取行动时使用的能力标签关系映射
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Lyra|Abilities")
	TObjectPtr<ULyraAbilityTagRelationshipMapping> TagRelationshipMapping;
	// TObjectPtr，指向能力标签关系映射对象

	// 玩家控制的Pawn用于创建输入映射和绑定输入操作的输入配置
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Lyra|Input")
	TObjectPtr<ULyraInputConfig> InputConfig;
	// TObjectPtr，指向输入配置对象

	// 玩家控制的Pawn使用的默认相机模式
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Lyra|Camera")
	TSubclassOf<ULyraCameraMode> DefaultCameraMode;
	// 模板类，限制为ULyraCameraMode或其派生类
};